#ifndef _B_SIGNAL_SOLTS_H_
#define _B_SIGNAL_SOLTS_H_
#include "b_config.h"
#if _SIGNAL_SOLTS_ENABLE

#ifdef __cplusplus
extern "C" {
#endif
#include "b_list.h"
#include "stdint.h"

typedef void (*B_SOLTS)(void *slotsArg, void *pArg);

typedef struct b_solts_item
{
    struct b_solts_item *next;
    B_SOLTS              solts_handle;
    void *               soltsArg;
} B_SOLTS_ITEM_T;

typedef struct b_signal
{
    // struct b_signal *next;
    B_SOLTS_ITEM_T *solts;
} B_SIGNAL_T;

#define B_SOLTS_T(FuncName) void(FuncName)(void *slotsArg, void *pArg)

/******************************************************************
 * @函数说明：   发送信号
 * @输入参数：   signal    信号的指针（指针的指针）
 *              arg       传递的参数（void *）
 * @输出参数：   无
 * @返回参数：   int
 * @修改记录：   ----
 ******************************************************************/
int b_signalsolts_emit(B_SIGNAL_T *signal, void *arg);

#define SIMPLE_EMIT(signal, arg) b_signalsolts_emit(signal, arg)

#define SIMPLE_EMIT_UINT8(signal, arg)   \
    do                                   \
    {                                    \
        uint8_t xx = arg;                \
        b_signalsolts_emit(signal, &xx); \
    } while (0)

/******************************************************************
 * @函数说明：   把信号与槽连接起来。
 * @输入参数：   SIMPLE_SIGNAL *signal   信号的指针（指针的指针）
 *              B_SOLTS solts,     槽（回调函数）
 *              void *arg               回调时的参数
 * @输出参数：   无
 * @返回参数：   int
 * @修改记录：   ----
 ******************************************************************/
int b_signalsolts_connect(B_SIGNAL_T *signal, B_SOLTS_ITEM_T *solts, B_SOLTS solts_handle,
                          void *soltsArg);
/******************************************************************
  * @函数说明：   断开信号槽
  * @输入参数：   SIMPLE_SIGNAL *singnal 信号的指针（指针的指针）
                 B_SOLTS solts     槽
  * @输出参数：   无
  * @返回参数：   int
  * @修改记录：   ----
******************************************************************/
int b_signalsolts_disconnect(B_SIGNAL_T *signal, B_SOLTS_ITEM_T *solts);

#ifdef __cplusplus
}
#endif

#endif
#endif
